package com.hope.hotel.service;

import com.hope.hotel.common.Result;
import com.hope.hotel.entity.dto.BookingDTO;

/**
 * 预订服务接口
 */
public interface BookingService {
    /**
     * 创建预订
     * @param bookingDTO 预订信息
     * @return 结果
     */
    Result createBooking(BookingDTO bookingDTO);
    
    /**
     * 获取用户的所有预订
     * @param userId 用户ID
     * @return 结果
     */
    Result getUserBookings(String userId);
    
    /**
     * 获取预订详情
     * @param bookingId 预订ID
     * @param userId 用户ID
     * @return 结果
     */
    Result getBookingDetail(String bookingId, String userId);
    
    /**
     * 取消预订
     * @param bookingId 预订ID
     * @param userId 用户ID
     * @return 结果
     */
    Result cancelBooking(String bookingId, String userId);
    
    /**
     * 获取酒店的所有预订
     * @param hotelId 酒店ID
     * @param page 页码
     * @param pageSize 每页大小
     * @return 结果
     */
    Result getHotelBookings(String hotelId, int page, int pageSize);
    
    /**
     * 搜索酒店订单
     * @param hotelId 酒店ID
     * @param keyword 关键词（订单号或客户名）
     * @param status 订单状态
     * @param startDate 入住日期起
     * @param endDate 入住日期止
     * @param page 页码
     * @param pageSize 每页大小
     * @param adminId 管理员ID
     * @return 结果
     */
    Result searchHotelBookings(String hotelId, String keyword, String status, String startDate, String endDate, int page, int pageSize, String adminId);
    
    /**
     * 管理员更新订单状态
     * @param bookingId 订单ID
     * @param status 状态
     * @param adminId 管理员ID
     * @return 结果
     */
    Result updateBookingStatus(String bookingId, String status, String adminId);
    
    /**
     * 获取订单详情（管理员视角）
     * @param bookingId 订单ID
     * @param adminId 管理员ID
     * @return 结果
     */
    Result getBookingDetailForAdmin(String bookingId, String adminId);
    
    /**
     * 更新订单支付状态
     * @param bookingId 订单ID
     * @param payStatus 支付状态(0:未支付,1:已支付)
     * @param adminId 管理员ID
     * @return 结果
     */
    Result updatePayStatus(String bookingId, Integer payStatus, String adminId);
    
    /**
     * 获取酒店订单统计数据
     * @param hotelId 酒店ID
     * @param adminId 管理员ID
     * @return 包含各种状态订单数量的统计数据
     *         {
     *           "booked": 订单数,
     *           "checked_in": 入住数,
     *           "confirmed": 完成数,
     *           "cancelled": 取消数
     *         }
     */
    Result getHotelBookingStats(String hotelId, String adminId);
    
    /**
     * 获取订单图表统计数据
     * @param hotelId 酒店ID
     * @param period 周期类型：month(月度)、quarter(季度)、year(年度)
     * @param startDate 开始日期（可选）
     * @param endDate 结束日期（可选）
     * @param adminId 管理员ID
     * @return 包含订单数量和收入的时间序列数据
     *         {
     *           "dates": ["一月", "二月", ...] 或 ["第一季度", "第二季度", ...] 或 ["2020", "2021", ...],
     *           "orderCounts": [订单数量数组],
     *           "revenue": [收入金额数组],
     *           // 如果period为year，还需要提供以下数据
     *           "yearlyOrderCount": [年度订单数量数组],
     *           "yearlyRevenue": [年度收入金额数组]
     *         }
     */
    Result getOrderChartStatistics(String hotelId, String period, String startDate, String endDate, String adminId);
    
    /**
     * 获取房型订单分布统计
     * @param hotelId 酒店ID
     * @param adminId 管理员ID
     * @return 包含各房型订单数量的统计数据
     *         [
     *           {
     *             "roomType": "房型名称",
     *             "count": 订单数量
     *           },
     *           ...
     *         ]
     */
    Result getRoomTypeBookingStats(String hotelId, String adminId);
}